{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Semi Gradient  n-step SARSA\n",
    "\n",
    "In this notebook, we will be using n-step SARSA with function approximation using Tiles to solve Mountain Car Environment.\n",
    "\n",
    "![nStepSARSA](./images/nstepSarsa.png \"n-Step SARSA\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import sys\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import gym"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mountain Car Environment\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x1ffb197eb50>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "env = gym.make('MountainCar-v0') # rest of the code is designed to work only for this environment. It will require change for other environments\n",
    "\n",
    "# increase episode length from 200 to 4000\n",
    "env._max_episode_steps = 4000\n",
    "\n",
    "np.random.seed(13)\n",
    "env.reset()\n",
    "print(\"Mountain Car Environment\")\n",
    "plt.imshow(env.render('rgb_array'))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# the implementation of tiles3 is from Richard Sutton's website\n",
    "# http://incompleteideas.net/tiles/tiles3.html\n",
    "from tiles3 import IHT, tiles"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "class QEstimator:\n",
    "\n",
    "    def __init__(self, step_size, num_of_tilings=8, tiles_per_dim=8, max_size=2048, epsilon=0.0):\n",
    "        self.max_size = max_size\n",
    "        self.num_of_tilings = num_of_tilings\n",
    "        self.tiles_per_dim = tiles_per_dim\n",
    "        self.epsilon = epsilon\n",
    "        self.step_size = step_size / num_of_tilings\n",
    "        \n",
    "        self.table = IHT(max_size)\n",
    "        \n",
    "        self.w = np.zeros(max_size)\n",
    "        \n",
    "        self.pos_scale = self.tiles_per_dim / (env.observation_space.high[0] \\\n",
    "                                                  - env.observation_space.low[0])\n",
    "        self.vel_scale = self.tiles_per_dim / (env.observation_space.high[1] \\\n",
    "                                                  - env.observation_space.low[1])\n",
    "        \n",
    "    def get_active_features(self, state, action):\n",
    "        pos, vel = state\n",
    "        active_features = tiles(self.table, self.num_of_tilings,\n",
    "                            [self.pos_scale * (pos - env.observation_space.low[0]), \n",
    "                             self.vel_scale * (vel- env.observation_space.low[1])],\n",
    "                            [action])\n",
    "        return active_features\n",
    "        \n",
    "    def q_predict(self, state, action):\n",
    "        pos, vel = state\n",
    "        if pos == env.observation_space.high[0]:  # reached goal\n",
    "            return 0.0\n",
    "        else:\n",
    "            active_features = self.get_active_features(state, action)\n",
    "            return np.sum(self.w[active_features])\n",
    "        \n",
    "    \n",
    "    # learn with given state, action and target\n",
    "    def q_update(self, state, action, target):\n",
    "        active_features = self.get_active_features(state, action)\n",
    "        q_s_a = np.sum(self.w[active_features])\n",
    "        delta = (target - q_s_a)\n",
    "        self.w[active_features] += self.step_size * delta\n",
    "        \n",
    "    def get_eps_greedy_action(self, state):\n",
    "        pos, vel = state\n",
    "        if np.random.rand() < self.epsilon:\n",
    "            return np.random.choice(env.action_space.n)\n",
    "        else:\n",
    "            qvals = np.array([self.q_predict(state, action) for action in range(env.action_space.n)])\n",
    "            return np.argmax(qvals)\n",
    "            \n",
    "    \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sarsa_n(qhat, step_size=0.5, epsilon=0.0, n=1, gamma=1.0, episode_cnt = 10000):\n",
    "    episode_rewards = []\n",
    "    for _ in range(episode_cnt):\n",
    "        state = env.reset()\n",
    "        action = qhat.get_eps_greedy_action(state)\n",
    "        T = float('inf')\n",
    "        t = 0\n",
    "        states = [state]\n",
    "        actions = [action]\n",
    "        rewards = [0.0]\n",
    "        while True:\n",
    "            if t < T:\n",
    "                next_state, reward, done, _ = env.step(action)\n",
    "                states.append(next_state)\n",
    "                rewards.append(reward)\n",
    "                \n",
    "                if done:\n",
    "                    T = t+1\n",
    "                else:\n",
    "                    next_action = qhat.get_eps_greedy_action(next_state)\n",
    "                    actions.append(next_action)\n",
    "\n",
    "            tau = t - n + 1\n",
    "            \n",
    "            if tau >= 0:\n",
    "                G = 0\n",
    "                for i in range(tau+1, min(tau+n, T)+1):\n",
    "                    G += gamma ** (i-tau-1) * rewards[i]\n",
    "                if tau+n < T:\n",
    "                    G += gamma**n * qhat.q_predict(states[tau+n], actions[tau+n])\n",
    "                qhat.q_update(states[tau], actions[tau], G)\n",
    "            \n",
    "            if tau == T - 1:\n",
    "                episode_rewards.append(np.sum(rewards))\n",
    "                break\n",
    "            else:\n",
    "                t += 1\n",
    "                state = next_state\n",
    "                action = next_action\n",
    "    \n",
    "    return np.array(episode_rewards)\n",
    "        \n",
    "    \n",
    "    \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# plot rewards\n",
    "def plot_rewards(env_name, rewards, label):\n",
    "    plt.title(\"env={}, Mean reward = {:.1f}\".format(env_name,np.mean(rewards[-20:])))\n",
    "    plt.plot(rewards, label=label)\n",
    "    plt.grid()\n",
    "    plt.legend()\n",
    "    plt.ylim(-500, 0)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Bg0axKFDh/jtb3/Lm2++Se/evXnzzTfZt28fN910E6eccgonn3xyKC5jx45l+PDhDBs2jM6dO/Pwww9HXX/Lli00aNAg9Ezq168fJsivvfYa1157LUOHDvUsCAEGDBjAhg3WktF79+6lrKyMJk2aAJCXl0fnzp1Dx3744YdcfPHFXHnllbzxxhue10sUtfwVpYp4+KOFLNq4J63X7Nq6IQ9d7L807dChQxk9ejQnnngiQ4YM4YorruCss86itLSU22+/nQ8++IBmzZrx5ptvcv/99/Piiy8CkJuby6RJk3jyyScZPnw4s2fPpnHjxnTo0IE777wzJEqRLFy4kD59+sSM89SpU5k3bx6NGzemrKyM9957j4YNG7Jt2zZOO+00LrnkEubMmcMbb7zBt99+S1lZGX369KFv376e19u8eTNTpkxhyZIlXHLJJVx++eVRx4wePZrPPvuMNm3asGvXLnJzcxk9ejSzZs3i6aefBuC+++7jnHPO4cUXX2TXrl3079+fIUOGADBjxgwWLFhA3bp1OeWUU7jwwgvp169f6Pq9evWiRYsWtG/fnsGDBzNixAguvvji0P4333yTL774gqVLl/L0009HuX8Axo8fz6WXXgpA48aNueSSS2jXrh2DBw/moosu4qqrrgpN5vbOO+8wevRoWrRoweWXX869994b85kHQcVfUWoQ9evXZ/bs2UyePJmJEydyxRVX8Oijj9KvXz8WLFjAueeeC0B5eTmtWlUux3vJJZcA0KNHD7p16xbad8IJJ7B+/Xpf8Y/k1ltvZcqUKeTm5jJz5kwAzj33XBo3bgxYbqL77ruPSZMmkZWVxYYNG9i8eTOTJ0/mBz/4AXXr1g2LjxcXXnghWVlZdO3alc2bN3sec/rpp3PDDTfwox/9iBEjRnge8/nnn/Phhx+G2hZKSkpYt25dKM5OmkeMGMGUKVPCxD87O5vx48czc+ZMvvzyS+68805mz57NqFGjmDlzJs2aNaNdu3a0bduWm266iZ07d3LssccCcNddd3H33XezZcsWpk2bFrrmCy+8wPz585kwYQJPPPEEX3zxBWPHjmXz5s2sWrWKM844AxEhJyeHBQsW0L179/gvJAYq/opSRcSy0KuS7OxsCgoKKCgooEePHrz88sv07duXbt26MXXqVM9zHDdRVlZW6LezXVZW5nuvbt268e6774a2n3nmGbZt2xYmlG5/96uvvsrWrVuZPXs2tWrVIj8/P9Q3PWhXRXf8nMWo7r//fsaNGwdYvv3nnnuO6dOnM27cOHr37s3cuXOjrmOM4d133w1zrwBMnz49Ki5ecRMR+vfvT//+/Tn33HO58cYbGTVqFK+//jpLliwhPz8fgD179vDuu+9y8803A5bPf8SIETz11FNcf/31zJ49O3TNHj160KNHD6699lrat2/P2LFjefPNN9m1a1fIrbRnzx7eeOMNHnnkkUDPyw/1+StKDWLp0qUsX748tD137lzatWtH586d2bp1a0j8S0tLWbgw9em0zjnnHEpKSnj22WdDYfv37/c9fvfu3TRv3pxatWoxceJE1q61ZhseNGgQ7733HgcOHGDv3r189NFHCcVjzJgxzJ07NyTyK1eu5NRTT2X06NE0bdqU9evX06BBA/bu3Rs657zzzuNvf/tbqAD59ttvQ/u++OILduzYwYEDB3j//fc5/fTTw+63ceNG5syZE9p2nnNFRQVvv/028+bNY82aNaxZs4YPPviA119/Pez8rKwsfvnLX1JRUcFnn31GcXExhYWFUdcDeP3113n33XdD15s9e3Za/P5q+StKDaK4uJjbb7+dXbt2kZOTQ8eOHXn++efJzc3lnXfe4Re/+AW7d++mrKyMO+64g27dUqudiAjvv/8+d955J48//jjNmjWjXr16PPbYY57HX3PNNVx88cX069eP3r1706VLFwD69OnDFVdcQe/evWnXrh1nnnlmSvG66667WL58OcYYBg8eTK9evTj++ON59NFH6d27N/feey8PPvggd9xxBz179sQYQ35+Ph9//DEAZ5xxBtdeey0rVqzg6quvDqvJgFV4/uY3v2Hjxo3Url2bZs2a8dxzzzFp0iTatGlDmzZtQscOGjSIRYsWhRrY3c/ugQce4PHHH+f999/n8ccf56c//Sl16tShXr16jB07ljVr1rBu3Tr69+8fOq99+/Y0bNiQ6dOnc+qpUWtgBaZa1vBNBl3MJTE0zdXD4sWLOemkkw7b/XSem/QzduzYsIbhI4GgafbKfyIy2xjTL/JYdfsoiqJkIOr2URRFcXHDDTdwww03VHc0qhy1/BUlzRwtrlSlZpFovlPxV5Q0Urt2bbZv364FgHJYcebzr127duBz1O2jKGmkbdu2FBUVhc3zUpWUlJQk9MHX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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# create a n-SARSA Learning agent\n",
    "step_size = 0.8\n",
    "episode_cnt = 1000\n",
    "n=4\n",
    "epsilon= 0.0\n",
    "gamma = 1.0\n",
    "\n",
    "estimator = QEstimator(step_size, epsilon=epsilon)\n",
    "rewards = sarsa_n(estimator, step_size=step_size, epsilon=epsilon, n=n, gamma=gamma, episode_cnt = episode_cnt)\n",
    "\n",
    "#plot rewards\n",
    "plot_rewards(\"Mountain Car World\",rewards, 'Semi Grad n-step SARSA')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "env.close()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
